package com.jdk.demo.reflect.clazz;

import java.lang.reflect.GenericArrayType;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.List;

public class GenericArrayTypeDemo {

	// Type getGenericComponentType()：获取泛型数组中元素的类型。注意无论从左向右有几个[]并列，这个方法仅仅脱去最右边的[]之后剩下的内容就作为这个方法的返回值。
	// 举个关于GenericArrayType的简单使用例子
	public static void main(String[] args) throws Exception {
        Method[] methods = GenericArrayTypeDemo.class.getMethods();
        for (Method method : methods) {
            if ("method".equals(method.getName())) {
                Type[] genericParameterTypes = method.getGenericParameterTypes();
                for (Type type : genericParameterTypes) {
                    if (type instanceof GenericArrayType) {
                        // 这里分析一下：
                    	// String[] strings：数组是Class类型。
                    	// List<String> ls：列表是ParameterizedType类型。
                    	// List<String>[] lsa：数组是GenericArrayType类型，调用getGenericComponentType后返回的类型是java.util.List<java.lang.String>，也就是数组元素是ParameterizedType类型。
                    	// T[] ts：s数组是GenericArrayType类型，调用getGenericComponentType后返回的类型是T，也就是数组元素是TypeVariable类型。
                    	// List<T>[] tla：数组是GenericArrayType类型，调用getGenericComponentType后返回的类型是java.util.List<T>，也就是数组元素是ParameterizedType类型。
                    	// T[][] tts：数组是GenericArrayType类型，调用getGenericComponentType后返回的类型T[]，也就是数组元素是GenericArrayType类型。
                    	System.out.println("GenericArrayType --> " + type + " getGenericComponentType --> " + ((GenericArrayType) type).getGenericComponentType());
                    } else {
                        System.out.println("Not GenericArrayType --> " + type);
                    }
                }
            }
        }
    }
	/**
	genericParameterTypes: Type[6]
		--[0]: class [Ljava.lang.String;
			--componentType: class java.lang.String
			--genericInfo: null
			--name: [Ljava.lang.String;
		--[1]: ParameterizedTypeImpl
			--actualTypeArguments: Type[1]
				--[0]: class java.lang.String
					--componentType: null
					--genericInfo: null
					--name: java.lang.String
			--ownerType: null
			--rawType: interface java.util.List
				--componentType: null
				--genericInfo: sun.reflect.generics.repository.ClassRepository@7a187f14
					--factory: sun.reflect.generics.factory.CoreReflectionFactory@6f195bc3
						--decl: interface java.util.List
						--scope: sun.reflect.generics.scope.ClassScope@51e2adc7
							--enclosingScope: null
							--recvr: interface java.util.List
					--tree: 语法树
				--name: java.util.List
		--[2]: GenericArrayTypeImpl(java.util.List<java.lang.String>)
			--genericComponentType: ParameterizedTypeImpl(java.util.List<java.lang.String>)
				--actualTypeArguments: Type[1]
					--[0]: class java.lang.String
						--componentType: null
						--genericInfo: null
						--name: java.lang.String
				--ownerType: null
				--rawType: interface java.util.List
					--componentType: null
					--genericInfo: sun.reflect.generics.repository.ClassRepository@7a187f14
						--factory: sun.reflect.generics.factory.CoreReflectionFactory@6f195bc3
							--decl: interface java.util.List
							--scope: sun.reflect.generics.scope.ClassScope@51e2adc7
								--enclosingScope: null
								--recvr: interface java.util.List
						--tree: 语法树
					--name: java.util.List
		--[3]: GenericArrayTypeImpl(T[])
			--genericComponentType: TypeVariableImpl(T)
				--bounds: FieldTypeSignature[2]
						--[0]: sun.reflect.generics.tree.ClassTypeSignature@7e2d773b
							--path: ArrayList<E>
								--[0]: sun.reflect.generics.tree.SimpleClassTypeSignature@307f6b8c
									--dollar: false
									--name: java.lang.Object
									--typeArgs: []
				--factory: sun.reflect.generics.factory.CoreReflectionFactory@2173f6d9
						--decl: public static void com.jdk.demo.reflect.clazz.GenericArrayTypeDemo.method(java.lang.String[],java.util.List,java.util.List[],java.lang.Object[],java.util.List[],java.lang.Object[][])
		    			--scope: sun.reflect.generics.scope.ClassScope@7a1ebcd8
				    			--enclosingScope: null
				    			--recvr: public static void com.jdk.demo.reflect.clazz.GenericArrayTypeDemo.method(java.lang.String[],java.util.List,java.util.List[],java.lang.Object[],java.util.List[],java.lang.Object[][])
				--genericDeclaration: public static void com.jdk.demo.reflect.clazz.GenericArrayTypeDemo.method(java.lang.String[],java.util.List,java.util.List[],java.lang.Object[],java.util.List[],java.lang.Object[][])
				--nanme: T
		--[4]: GenericArrayTypeImpl(java.util.List<T>[])
			--genericComponentType: ParameterizedTypeImpl(java.util.List<T>)
				--actualTypeArguments: Type[1]
					--[0]: TypeVariableImpl(T)
						--bounds: FieldTypeSignature[2]
							--[0]: sun.reflect.generics.tree.ClassTypeSignature@7e2d773b
								--path: ArrayList<E>
									--[0]: sun.reflect.generics.tree.SimpleClassTypeSignature@307f6b8c
										--dollar: false
										--name: java.lang.Object
										--typeArgs: []
						--factory: sun.reflect.generics.factory.CoreReflectionFactory@2173f6d9
								--decl: public static void com.jdk.demo.reflect.clazz.GenericArrayTypeDemo.method(java.lang.String[],java.util.List,java.util.List[],java.lang.Object[],java.util.List[],java.lang.Object[][])
				    			--scope: sun.reflect.generics.scope.ClassScope@7a1ebcd8
						    			--enclosingScope: null
						    			--recvr: public static void com.jdk.demo.reflect.clazz.GenericArrayTypeDemo.method(java.lang.String[],java.util.List,java.util.List[],java.lang.Object[],java.util.List[],java.lang.Object[][])
						--genericDeclaration: public static void com.jdk.demo.reflect.clazz.GenericArrayTypeDemo.method(java.lang.String[],java.util.List,java.util.List[],java.lang.Object[],java.util.List[],java.lang.Object[][])
						--nanme: T
				--ownerType: null
				--rawType: interface java.util.List
					--componentType: null
					--genericInfo: sun.reflect.generics.repository.ClassRepository@7a187f14
						--factory: sun.reflect.generics.factory.CoreReflectionFactory@6f195bc3
							--decl: interface java.util.List
							--scope: sun.reflect.generics.scope.ClassScope@51e2adc7
								--enclosingScope: null
								--recvr: interface java.util.List
						--tree: 语法树
					--name: java.util.List
		--[5]: GenericArrayTypeImpl(T[][])
			--genericComponentType: ParameterizedTypeImpl(T[])
				--genericComponentType: TypeVariableImpl(T)
					--bounds: FieldTypeSignature[2]
							--[0]: sun.reflect.generics.tree.ClassTypeSignature@7e2d773b
								--path: ArrayList<E>
									--[0]: sun.reflect.generics.tree.SimpleClassTypeSignature@307f6b8c
										--dollar: false
										--name: java.lang.Object
										--typeArgs: []
					--factory: sun.reflect.generics.factory.CoreReflectionFactory@2173f6d9
							--decl: public static void com.jdk.demo.reflect.clazz.GenericArrayTypeDemo.method(java.lang.String[],java.util.List,java.util.List[],java.lang.Object[],java.util.List[],java.lang.Object[][])
			    			--scope: sun.reflect.generics.scope.ClassScope@7a1ebcd8
					    			--enclosingScope: null
					    			--recvr: public static void com.jdk.demo.reflect.clazz.GenericArrayTypeDemo.method(java.lang.String[],java.util.List,java.util.List[],java.lang.Object[],java.util.List[],java.lang.Object[][])
					--genericDeclaration: public static void com.jdk.demo.reflect.clazz.GenericArrayTypeDemo.method(java.lang.String[],java.util.List,java.util.List[],java.lang.Object[],java.util.List[],java.lang.Object[][])
					--nanme: T
	*/

    public static <T> void method(String[] strings, List<String> ls, List<String>[] lsa, T[] ts, List<T>[] tla, T[][] tts) {

    }

}
